/**
 * 基础实体类型
 */
export interface BaseEntity {
    /** 唯一标识符 */
    id: string;
    /** 创建时间 */
    createTime: number;
    /** 修改时间 */
    updateTime: number;
}

/**
 * 加密器接口
 */
export interface IEncryption {
    /** 加密数据 */
    encrypt(data: string): string | Promise<string>;
    /** 解密数据 */
    decrypt(encryptedData: string): string | Promise<string>;
}

/**
 * 文件空间配置
 */
export interface FileSpaceConfig {
    /** 文件空间根路径 */
    rootPath: string;
    /** 最大目录深度 */
    maxDepth: number;
    /** 最大历史记录数 */
    maxHistoryCount: number;
    /** 加密器实例 */
    encryption?: IEncryption;
}

/**
 * 文件索引项
 */
export interface FileIndexItem extends BaseEntity {
    /** 标题 */
    title: string;
    /** 扩展名 */
    extension: string;
    /** 相对路径（使用ID作为文件名的实际路径） */
    relativePath: string;
    /** 虚拟相对路径（使用原始文件名的路径） */
    vRelativePath: string;
    /** 是否为目录 */
    isDirectory: boolean;
    /** 文件大小（字节） */
    size: number;
}

/**
 * 文件历史记录
 */
export interface FileHistory extends BaseEntity {
    /** 关联的文件ID */
    fileId: string;
    /** 文件内容 */
    content: string;
    /** 版本号 */
    version: number;
}

/**
 * 操作结果
 */
export interface OperationResult<T> {
    /** 是否成功 */
    success: boolean;
    /** 错误信息 */
    error?: string;
    /** 数据 */
    data?: T;
}

/**
 * 目录树节点
 */
export interface DirectoryTreeNode {
    /** 节点ID */
    id: string;
    /** 文件或目录信息 */
    item: FileIndexItem;
    /** 子节点 */
    children?: DirectoryTreeNode[];
    /** 是否展开 */
    expanded?: boolean;
    /** 节点层级 */
    level: number;
}

/**
 * 目录树遍历选项
 */
export interface TreeWalkOptions {
    /** 是否包含文件 */
    includeFiles?: boolean;
    /** 是否递归遍历子目录 */
    recursive?: boolean;
    /** 最大遍历深度，-1表示无限制 */
    maxDepth?: number;
    /** 过滤函数 */
    filter?: (item: FileIndexItem) => boolean;
    /** 是否从指定路径开始构建树，而不是从其父目录开始 */
    startFromPath?: boolean;
}

/**
 * 目录树遍历回调函数
 */
export type TreeWalkCallback = (node: DirectoryTreeNode, parentNode?: DirectoryTreeNode) => void | Promise<void>;

/**
 * 缓存配置
 */
export interface CacheConfig {
    /** 是否启用缓存 */
    enabled: boolean;
    /** 缓存过期时间（毫秒） */
    ttl: number;
    /** 最大缓存条目数 */
    maxEntries: number;
    /** 单个缓存项最大大小（字节） */
    maxItemSize: number;
}

/**
 * 缓存项
 */
export interface CacheItem<T> {
    /** 缓存的数据 */
    data: T;
    /** 创建时间 */
    createTime: number;
    /** 最后访问时间 */
    lastAccessTime: number;
    /** 访问次数 */
    accessCount: number;
    /** 数据大小（字节） */
    size: number;
}

/**
 * 自动备份配置
 */
export interface AutoBackupConfig {
    /** 是否启用自动备份 */
    enabled: boolean;
    /** 备份间隔（毫秒） */
    interval: number;
    /** 最大备份文件数 */
    maxBackups: number;
    /** 备份保留时间（毫秒） */
    retentionTime: number;
    /** 单个备份最大大小（字节） */
    maxBackupSize: number;
}

/**
 * 备份元数据
 */
export interface BackupMetadata {
    /** 备份ID */
    id: string;
    /** 原始文件ID */
    fileId: string;
    /** 备份时间 */
    backupTime: number;
    /** 备份类型 */
    type: 'auto' | 'manual';
    /** 备份大小 */
    size: number;
    /** 文件状态（用于恢复） */
    fileState: {
        relativePath: string;
        lastModified: number;
        size: number;
    };
}

/**
 * 恢复点信息
 */
export interface RecoveryPoint {
    /** 恢复点ID */
    id: string;
    /** 创建时间 */
    createTime: number;
    /** 涉及的文件列表 */
    files: BackupMetadata[];
    /** 恢复点描述 */
    description: string;
}

/**
 * 临时文件信息
 * 用于跟踪未保存的文件状态
 */
export interface TempFileInfo {
    /** 临时文件ID，格式：temp_时间戳_随机数 */
    id: string;
    /** 目标文件名，最终要创建的文件名 */
    targetName: string;
    /** 父目录ID，不提供则表示在根目录 */
    parentId?: string;
    /** 创建时间（毫秒时间戳） */
    createTime: number;
    /** 最后修改时间（毫秒时间戳） */
    lastModified: number;
    /** 是否已保存为正式文件 */
    saved: boolean;
}

/**
 * 临时文件管理器配置
 */
export interface TempFileConfig {
    /** 临时文件存储目录的绝对路径 */
    tempDir: string;
    /** 临时文件过期时间（毫秒），超过此时间的临时文件会被自动删除 */
    expireTime: number;
}

/**
 * 打开记录信息
 */
export interface OpenedFileRecord {
    /** 文件ID */
    fileId: string;
    /** 文件标题 */
    title: string;
    /** 是否为目录 */
    isDirectory: boolean;
    /** 首次打开时间 */
    firstOpenTime: number;
    /** 最后打开时间 */
    lastOpenTime: number;
    /** 打开次数 */
    openCount: number;
}

/**
 * 打开的目录缓存信息
 */
export interface OpenedDirectoryCache {
    /** 目录路径 */
    path: string;
    /** 目录树节点 */
    treeNode: DirectoryTreeNode;
    /** 缓存创建时间 */
    createTime: number;
    /** 最后访问时间 */
    lastAccessTime: number;
}
